home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / EFFECT.C < prev    next >
Text File  |  2000-03-25  |  2KB  |  109 lines

  1. /*
  2.     #include <stdio.h>
  3.     void    key_wait( void );
  4. */
  5. #include "effect.h"
  6.  
  7. #ifndef NULL
  8. #define NULL ((void *) 0)
  9. #endif
  10.  
  11. #define EFFECT_MAX    32    /* エフェクト最大数 */
  12. static EFFECT effect[EFFECT_MAX];    /* ワーク */
  13. static EFFECT *effect_top,    /* 使用中のワークのリスト */
  14.  *effect_null_top;        /* 空のワークのリスト */
  15.  
  16. typedef void (*func_init) (struct _effect *);
  17. func_init FuncInitEffect[]=
  18. {
  19.     InitEffectExplL,
  20.     InitEffectExpl,
  21.     InitEffectExplMini,
  22.     InitEffectExplPlayer,
  23.     InitEffectHahen,
  24.     InitEffectHahenMini,
  25.     InitEffectTitSpark,
  26. };
  27.  
  28.  
  29. void InitEffect( void )
  30. {
  31.     int i;
  32.  
  33.     /* リストをつなげる */
  34.     effect_top = NULL;
  35.     effect_null_top = effect;
  36.     for (i = 0; i < EFFECT_MAX; i++)
  37.         effect[i].next = &effect[i + 1];
  38.  
  39.     effect[EFFECT_MAX - 1].next = NULL;
  40. }
  41.  
  42.  
  43. /* エフェクト出現時に呼ばれる */
  44. void MakeEffect(short type, short type2, short x, short y)
  45. {
  46.     EFFECT *p;
  47.  
  48.     if (effect_null_top == NULL)
  49.         return;        /* 空きのワークがない(キャラクターオーバー) */
  50.  
  51.     p = effect_null_top;
  52.     effect_null_top = p->next;
  53.     p->next = effect_top;
  54.     effect_top = p;
  55.  
  56.     p->type = type;
  57.     p->type2 = type2;
  58.     p->x = x;
  59.     p->y = y;
  60.     FuncInitEffect[type] (p);    /* 初期化ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  61. }
  62.  
  63.  
  64.  
  65. /* 垂直同期ごとに呼ばれる */
  66. void MoveEffect( void )
  67. {
  68.     EFFECT *p, *q;
  69.  
  70.     p = effect_top;        /* 現在注目しているワーク */
  71.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  72.     while (p != NULL) {
  73.         /* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  74.         if( !(p->func_effect_move) (p) ) {    /* 返り値が0なら消去 */
  75.             if (q == NULL) {    /* リストの一番最初を削除 */
  76.                 effect_top = p->next;
  77.                 p->next = effect_null_top;
  78.                 effect_null_top = p;
  79.                 q = NULL;
  80.                 p = effect_top;
  81.             } else {
  82.                 q->next = p->next;
  83.                 p->next = effect_null_top;
  84.                 effect_null_top = p;
  85.                 p = q->next;
  86.             }
  87.         } else {
  88.             q = p;
  89.             p = p->next;
  90.         }
  91.     }
  92. }
  93.  
  94.  
  95.  
  96. /* エフェクト消去時に呼ばれる(面クリア等) */
  97. void EffectTini( void )
  98. {
  99.     int i;
  100.  
  101.     /* リストをつなげる */
  102.     effect_top = NULL;
  103.     effect_null_top = effect;
  104.     for (i = 0; i < EFFECT_MAX; i++)
  105.         effect[i].next = &effect[i + 1];
  106.  
  107.     effect[EFFECT_MAX - 1].next = NULL;
  108. }
  109.